<HTML>
<HEAD>
<!-- This HTML file has been created by texi2html 1.29
     from output.tnf on 19 December 2010 -->

<TITLE>Tasks related to generating output - Commonly used Output patterns for PTG</TITLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000" BACKGROUND="gifs/bg.gif">
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0" VALIGN=BOTTOM>
<TR VALIGN=BOTTOM>
<TD WIDTH="160" VALIGN=BOTTOM>
<A HREF="http://eli-project.sourceforge.net/">
<IMG SRC="gifs/elilogo.gif" BORDER=0>
</A>&nbsp;
</TD>
<TD WIDTH="25" VALIGN=BOTTOM>
<img src="gifs/empty.gif" WIDTH=25 HEIGHT=25>
</TD>
<TD ALIGN=LEFT WIDTH="475" VALIGN=BOTTOM>
<A HREF="index.html"><IMG SRC="gifs/title.png" BORDER=0></A>
</TD>
<!-- |DELETE FOR SOURCEFORGE LOGO|
<TD>
<a href="http://sourceforge.net/projects/eli-project">
<img
  src="http://sflogo.sourceforge.net/sflogo.php?group_id=70447&amp;type=13"
  width="120" height="30"
  alt="Get Eli: Translator Construction Made Easy at SourceForge.net.
    Fast, secure and Free Open Source software downloads"/>
</a>
</TD>
|DELETE FOR SOURCEFORGE LOGO| -->
</TR>
</TABLE>

<HR size=1 noshade width=785 align=left>
<TABLE BORDER=0 CELLSPACING=2 CELLPADDING=0>
<TR>
<TD VALIGN=TOP WIDTH="160">
<h4>General Information</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="index.html">Eli: Translator Construction Made Easy</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gindex_1.html#SEC1">Global Index</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="faq_toc.html" >Frequently Asked Questions</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Tutorials</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="EliRefCard_toc.html">Quick Reference Card</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="novice_toc.html">Guide For new Eli Users</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="news_toc.html">Release Notes of Eli</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="nametutorial_toc.html">Tutorial on Name Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="typetutorial_toc.html">Tutorial on Type Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Reference Manuals</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ui_toc.html">User Interface</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="pp_toc.html">Eli products and parameters</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lidoref_toc.html">LIDO Reference Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Libraries</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lib_toc.html">Eli library routines</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="modlib_toc.html">Specification Module Library</a></td></tr>
</table>

<h4>Translation Tasks</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lex_toc.html">Lexical analysis specification</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="syntax_toc.html">Syntactic Analysis Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="comptrees_toc.html">Computation in Trees</a></td></tr>
</table>

<h4>Tools</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lcl_toc.html">LIGA Control Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="show_toc.html">Debugging Information for LIDO</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gorto_toc.html">Graphical ORder TOol</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="fw_toc.html">FunnelWeb User's Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ptg_toc.html">Pattern-based Text Generator</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="deftbl_toc.html">Property Definition Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="oil_toc.html">Operator Identification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="tp_toc.html">Tree Grammar Specification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="clp_toc.html">Command Line Processing</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="cola_toc.html">COLA Options Reference Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="idem_toc.html">Generating Unparsing Code</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="mon_toc.html">Monitoring a Processor's Execution</a> </td></tr>
</table>

<h4>Administration</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="sysadmin_toc.html">System Administration Guide</a> </td></tr>
</table>

<HR WIDTH="100%">
<A HREF="mailto:eli-project-users@lists.sourceforge.net">
<IMG SRC="gifs/button_mail.gif" BORDER=0 ALIGN="left"></A>
<A HREF="index.html"><IMG SRC="gifs/home.gif" BORDER=0 ALIGN="right"></A>

</TD>
<TD VALIGN=TOP WIDTH="25"><img src="gifs/empty.gif" WIDTH=25 HEIGHT=25></TD>

<TD VALIGN=TOP WIDTH="600">
<H1>Tasks related to generating output</H1>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="output_1.html"><IMG SRC="gifs/prev.gif" ALT="Previous Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="output_3.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="output_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
<H1><A NAME="SEC2" HREF="output_toc.html#SEC2">Commonly used Output patterns for PTG</A></H1>
<P>
The module <CODE>PtgCommon</CODE> provides definitions for frequently used
PTG patterns.  These patterns fall into two categories:
The first one supports different types of output leaves; the
second contains frequently used patterns for building sequences.
<P>
The module does not have generic parameters.
It is used by including
<PRE>
   $/Output/PtgCommon.fw
</PRE>
in a <CODE>.specs</CODE> file.
<P>
The module introduces PTG specifications for patterns named <CODE>Id,
AsIs, CString, PString, CChar, Numb, Seq, CommaSeq</CODE>. When using
<CODE>PtgCommon.fw</CODE> these names must
not be specified in any other PTG specification.
<P>
The functions provided by this module 
may be used in <TT>`.lido'</TT> specifications or in
<TT>`.c'</TT> files. To introduce prototypes for the defined functions, use
the header file <CODE>PtgCommon.h</CODE>. 
<P>
<H4>Frequently Used Patterns</H4>
<A NAME="IDX6"></A>
<P>
The module <CODE>PtgCommon</CODE> provides useful and 
commonly used PTG patterns, especially for the output of
non-literal terminal symbols.
They are documented
both by showing their PTG pattern definitions and the signature of
the resulting pattern functions:
<P>
<A NAME="IDX7"></A>
<A NAME="IDX8"></A>
<DL COMPACT>
<DT><CODE>Pattern:            <CODE>Id: [PtgOutId $ int]</CODE></CODE>
<DD><DT><CODE>Resulting Function: <CODE>PTGNode PTGId(int id)</CODE></CODE>
<DD>The argument <CODE>id</CODE> must refer to an identifier or a string stored in
the character storage module of Eli, see  <A HREF="lib_1.html#SEC6">Character Storage Module of Library Reference Manual</A>. The PTG pattern produces the
same identifier or character string in the output.
<A NAME="IDX9"></A>
<A NAME="IDX10"></A>
<A NAME="IDX11"></A>
<P>
<DT><CODE>Pattern:            <CODE>AsIs: $ string</CODE></CODE>
<DD><DT><CODE>Resulting Function: <CODE>PTGNode PTGAsIs(char *string)</CODE></CODE>
<DD>The PTG pattern produces the specified argument <CODE>string</CODE> in the output.
The character string is not copied, only the pointer is.
<A NAME="IDX12"></A>
<A NAME="IDX13"></A>
<A NAME="IDX14"></A>
<P>
<DT><CODE>Pattern:            <CODE>Numb: $ int</CODE></CODE>
<DD><DT><CODE>Resulting Function: <CODE>PTGNode PTGNumb(int numb)</CODE></CODE>
<DD>The PTG pattern produces the given integral number.
<A NAME="IDX15"></A>
<A NAME="IDX16"></A>
<A NAME="IDX17"></A>
<A NAME="IDX18"></A>
<P>
<DT><CODE>Pattern:            <CODE>CString: [CPtgOutstr $ string]</CODE></CODE>
<DD><DT><CODE>Resulting Function: <CODE>PTGNode PTGCString(char *string)</CODE></CODE>
<DD><DT><CODE>and                 <CODE>PTGNode PTGCStringId(int id)</CODE></CODE>
<DD>The argument is a string.
The PTG pattern function produces the same character string 
quoted according to the rules of the C language.
<CODE>PTGCStringId</CODE> is macro based on <CODE>PTGCString</CODE>.
It takes an index into the character storage module of
Eli, see 
 <A HREF="lib_1.html#SEC6">Character Storage Module of Library Reference Manual</A>.
It produces the string stored there 
quoted according to the rules of the C language..
<P>
<A NAME="IDX19"></A>
<A NAME="IDX20"></A>
<A NAME="IDX21"></A>
<A NAME="IDX22"></A>
<P>
<DT><CODE>Pattern:            <CODE>PString: [PPtgOutstr $ string]</CODE></CODE>
<DD><DT><CODE>Resulting Function: <CODE>PTGNode PTGPString(char *string)</CODE></CODE>
<DD><DT><CODE>and                 <CODE>PTGNode PTGPStringId(int id)</CODE></CODE>
<DD>The argument is a string.
The PTG pattern function produces the same character string 
quoted according to the rules of the Pascal language.
<CODE>PTGPStringId</CODE> is macro based on <CODE>PTGPString</CODE>.
It takes an index into the character storage module of
Eli, see  <A HREF="lib_1.html#SEC6">Character Storage Module of Library Reference Manual</A>. It produces the string stored there 
quoted according to the rules of the Pascal language..
<A NAME="IDX23"></A>
<A NAME="IDX24"></A>
<A NAME="IDX25"></A>
<P>
<DT><CODE>Pattern:            <CODE>CChar: [CPtgOutchar $ int]</CODE></CODE>
<DD><DT><CODE>Resulting Function: <CODE>PTGNode PTGCChar(int c)</CODE></CODE>
<DD>The PTG pattern produces the specified value as C character literal.
<A NAME="IDX26"></A>
<A NAME="IDX27"></A>
<P>
<DT><CODE>Pattern:            <CODE>Seq: $ $</CODE></CODE>
<DD><DT><CODE>Resulting Function: <CODE>PTGNode PTGPSeq(PTGNode, PTGNode)</CODE></CODE>
<DD>Takes two arguments and yields a new node that prints the concatenation
of the given patterns.
<A NAME="IDX28"></A>
<A NAME="IDX29"></A>
<P>
<DT><CODE>Pattern:            <CODE>CommaSeq: $ { ", " } $</CODE></CODE>
<DD><DT><CODE>Resulting Function: <CODE>PTGNode PTGPCommaSeq(PTGNode, PTGNode)</CODE></CODE>
<DD>Takes two arguments and yields their concatenation
separated by a comma. By enclosing the separator
with braces, it is assured that a comma will be printed, only if none of the
arguments refers to the predefined value <CODE>PTGNULL</CODE> that
yields an empty output. This makes the pattern well suited to be used
in conjunction with the <CODE>CONSTITUENTS</CODE> construct. 
See  <A HREF="ptg_2.html#SEC6">Optional Parts in Patterns of Pattern-based text generator</A>, for details.
<A NAME="IDX30"></A>
<A NAME="IDX31"></A>
<P>
<DT><CODE>Pattern:            <CODE>Eol: $ "\n"</CODE></CODE>
<DD><DT><CODE>Resulting Function: <CODE>PTGNode PTGEol(PTGNode)</CODE></CODE>
<DD>This pattern attaches a newline at the end of the given text. 
Note that the 
PTG output functions do not automatically put a newline at the end of the output.
</DL>
<P>
<H4>Useful Embedded Functions</H4>
<P>
The functions embedded in the PTG patterns defined in
<CODE>PTGCommon.fw</CODE> (See  <A HREF="output_2.html#SEC2">Commonly used Output patterns for PTG</A>) might also be useful
in user defined patterns. These functions are:
<P>
<A NAME="IDX32"></A>
<DL COMPACT>
<DT><CODE><CODE>void PtgOutId (PTG_OUTPUT_FILE fs, int c);</CODE></CODE>
<DD>takes an index into the character storage module of
Eli, see  <A HREF="lib_1.html#SEC6">Character Storage Module of Library Reference Manual</A>. It outputs the string stored there.
<A NAME="IDX33"></A>
<P>
<DT><CODE><CODE>void CPtgOutstr (PTG_OUTPUT_FILE fs, char *s);</CODE></CODE>
<DD>takes a string argument and outputs the same string quoted according
to the rules of the C language.
<A NAME="IDX34"></A>
<P>
<DT><CODE><CODE>void CPtgOutchar (PTG_OUTPUT_FILE fs, int c);</CODE></CODE>
<DD>takes an integer character code and outputs the character.
<A NAME="IDX35"></A>
<P>
<DT><CODE><CODE>void PPtgOutstr (PTG_OUTPUT_FILE fs, int c);</CODE></CODE>
<DD>takes a string argument and outputs the same string quoted according
to the rules of the Pascal language.
<P>
</DL>
<P>
<H4>Examples</H4>
<P>
The first example will use a PTG pattern that prints an identifier or a
floating point number. This is done by defining the symbol role
<CODE>PtgLeaf</CODE> that computes a <CODE>ptg</CODE> attribute. It generates the
source text of the identifier when processed through a ptg processing
function. This role can be inherited by a tree symbol that appears
directly above a terminal, that was processed through the <CODE>mkidn</CODE>
gla processor.
<P>
<PRE>
   CLASS SYMBOL PtgLeaf: ptg: PTGNode;
 
   CLASS SYMBOL PtgLeaf COMPUTE
      THIS.ptg = PTGId(TERM);
   END;
</PRE>
<P>
In this example, the class symbol <CODE>PtgLeaf</CODE> can be used
later to denote all the different grammar symbols that compute ptg leaf
patterns. This is done for example in the second example, that computes
a PTG pattern that prints all occurrences of <CODE>PtgLeaf</CODE> in a comma 
separated list.
<P>
<PRE>
   CLASS SYMBOL LeafCommaList: ptg: PTGNode;
   CLASS SYMBOL LeafCommaList COMPUTE
      THIS.ptg = 
        CONSTITUENTS PtgLeaf.ptg 
        WITH (PTGNode, PTGCommaSeq, IDENTICAL, PTGNull);
   END;
</PRE>
<P>
Please refer to  <A HREF="lidoref_4.html#SEC5">Symbol Specifications of Lido Reference Manual</A>, for an explanation of symbol computations,
see  <A HREF="lidoref_9.html#SEC16">CONSTITUENT(S) of Lido Reference Manual</A>,
for an explanation of the <CODE>CONSTITUENT(S)</CODE>-construct and
read  <A HREF="lidoref_12.html#SEC21">Predefined Entities of Lido Reference Manual</A>, for an explanation of the predefined <CODE>IDENTICAL</CODE>-function. 
<A NAME="IDX36"></A>
<P>
<H4>Special Situation when Using C String Literals</H4>
<P>
A special situation occurs, if C string literals are input tokens and 
are to be reproduced identically. 
Two different token processors can be used to store the string:
If the <CODE>c_mkstr</CODE> processor is specified in a <TT>`.gla'</TT> file,
<PRE>
   CStringLit: $\" (auxCString) [c_mkstr]
</PRE>
the string is interpreted and the result is stored.
Such a string can be processed with the
pattern functions <CODE>PTGCStringId()</CODE> and <CODE>PTGPStringId()</CODE> 
to yield C or Pascal string literals on output.
However, as strings are null terminated in Eli, the first occurrence of
an embedded zero-character terminates the string, and the result is
truncated. A solution for this would be to not interpret the control
sequences and to store the string verbatim as it is provided on input. 
That is achieved by the token processor <CODE>mkstr</CODE>:
<PRE>
   CStringLit: $\" (auxCString) [mkstr]
</PRE>
<A NAME="IDX37"></A>
As control sequences are not interpreted by <CODE>mkstr</CODE>,
<CODE>PTGPString</CODE> and <CODE>PTGCString</CODE> can not be used to
produce an identical output string. Instead, the pattern function
<CODE>PTGAsIs</CODE> is to be used. Since the latter token processor can handle
embedded zero characters, it is used in the 
canned description <CODE>C_STRING_LIT</CODE> for C string literals.
See  <A HREF="lex_2.html#SEC13">Canned Descriptions of Lexical Analysis</A>.
<P>
<A NAME="IDX39"></A>
<A NAME="IDX38"></A>
<HR size=1 noshade width=600 align=left>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="output_1.html"><IMG SRC="gifs/prev.gif" ALT="Previous Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="output_3.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="output_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
</TD>
</TR>
</TABLE>

</BODY></HTML>
